/**
 * Create in 2012-4-16.
 */
package kit4j.common.model;

import kit4j.common.command.Command;

/**
 * 更新模型对象命令的抽象类型。该类型封装了对模型对象更新后对其持有者的更新操作，便于创建一个自定义更新模型对象命令。
 * 
 * @author MiniKnife
 * 
 */
public abstract class AbstractModelUpdateCommand<T> implements Command {

	/**
	 * 模型对象持有者。
	 */
	private ModelHolder<T> modelHolder;

	/**
	 * 创建一个更新模型命令对象。
	 * 
	 * @param modelHolder
	 *            模型对象持有者
	 */
	public AbstractModelUpdateCommand(ModelHolder<T> modelHolder) {
		setModelHolder(modelHolder);
	}

	/**
	 * @return the modelHolder
	 */
	public ModelHolder<T> getModelHolder() {
		return modelHolder;
	}

	/**
	 * @param modelHolder
	 *            the modelHolder to set
	 */
	public void setModelHolder(ModelHolder<T> modelHolder) {
		this.modelHolder = modelHolder;
	}

	/**
	 * @see kit4j.common.command.Command#execute()
	 */
	@Override
	public void execute() throws Exception {
		T object = getModelHolder().getModelObject();

		object = doUpdate(object);

		getModelHolder().setModelObject(object);
	}

	/**
	 * 对指定的模型对象进行更新操作。
	 * 
	 * @param object
	 *            要更新的模型对象
	 * @return 更新后的模型对象
	 * @throws Exception
	 *             如果更新失败或更新过程中出现异常。
	 */
	abstract protected T doUpdate(T object) throws Exception;

}
